<!--{
	"Title": "Contributing to the gccgo frontend"
}-->

<h2>Introduction</h2>

<p>
These are some notes on contributing to the gccgo frontend for GCC.
For information on contributing to parts of Go other than gccgo,
see <a href="/doc/contribute.html">Contributing to the Go project</a>.  For
information on building gccgo for yourself,
see <a href="/doc/gccgo_install.html">Setting up and using gccgo</a>.
For more of the gritty details on the process of doing development
with the gccgo frontend,
see <a href="https://go.googlesource.com/gofrontend/+/master/HACKING">the
file HACKING</a> in the gofrontend repository.
</p>

<h2>Legal Prerequisites</h2>

<p>
You must follow the <a href="/doc/contribute.html#copyright">Go copyright
rules</a> for all changes to the gccgo frontend and the associated
libgo library.  Code that is part of GCC rather than gccgo must follow
the general <a href="https://gcc.gnu.org/contribute.html">GCC
contribution rules</a>.
</p>

<h2>Code</h2>

<p>
The master sources for the gccgo frontend may be found at
<a href="https://go.googlesource.com/gofrontend">https://go.googlesource.com/gofrontend</a>.
They are mirrored
at <a href="https://github.com/golang/gofrontend">https://github.com/golang/gofrontend</a>.
The master sources are not buildable by themselves, but only in
conjunction with GCC (in the future, other compilers may be
supported).  Changes made to the gccgo frontend are also applied to
the GCC source code repository hosted at <code>gcc.gnu.org</code>.  In
the <code>gofrontend</code> repository, the <code>go</code> directory
is mirrored to the <code>gcc/go/gofrontend</code> directory in the GCC
repository, and the <code>gofrontend</code> <code>libgo</code>
directory is mirrored to the GCC <code>libgo</code> directory.  In
addition, the <code>test</code> directory
from <a href="//go.googlesource.com/go">the main Go repository</a>
is mirrored to the <code>gcc/testsuite/go.test/test</code> directory
in the GCC repository.
</p>

<p>
Changes to these directories always flow from the master sources to
the GCC repository.  The files should never be changed in the GCC
repository except by changing them in the master sources and mirroring
them.
</p>

<p>
The gccgo frontend is written in C++.
It follows the GNU and GCC coding standards for C++.
In writing code for the frontend, follow the formatting of the
surrounding code.
Almost all GCC-specific code is not in the frontend proper and is
instead in the GCC sources in the <code>gcc/go</code> directory.
</p>

<p>
The run-time library for gccgo is mostly the same as the library
in <a href="//go.googlesource.com/go">the main Go repository</a>.
The library code in the Go repository is periodically merged into
the <code>libgo/go</code> directory of the <code>gofrontend</code> and
then the GCC repositories, using the shell
script <code>libgo/merge.sh</code>.  Accordingly, most library changes
should be made in the main Go repository.  The files outside
of <code>libgo/go</code> are gccgo-specific; that said, some of the
files in <code>libgo/runtime</code> are based on files
in <code>src/runtime</code> in the main Go repository.
</p>

<h2>Testing</h2>

<p>
All patches must be tested.  A patch that introduces new failures is
not acceptable.
</p>

<p>
To run the gccgo test suite, run <code>make check-go</code> in your
build directory.  This will run various tests
under <code>gcc/testsuite/go.*</code> and will also run
the <code>libgo</code> testsuite.  This copy of the tests from the
main Go repository is run using the DejaGNU script found
in <code>gcc/testsuite/go.test/go-test.exp</code>.
</p>

<p>
Most new tests should be submitted to the main Go repository for later
mirroring into the GCC repository.  If there is a need for specific
tests for gccgo, they should go in
the <code>gcc/testsuite/go.go-torture</code>
or <code>gcc/testsuite/go.dg</code> directories in the GCC repository.
</p>

<h2>Submitting Changes</h2>

<p>
Changes to the Go frontend should follow the same process as for the
main Go repository, only for the <code>gofrontend</code> project and
the <code>gofrontend-dev@googlegroups.com</code> mailing list
rather than the <code>go</code> project and the
<code>golang-dev@googlegroups.com</code> mailing list.  Those changes
will then be merged into the GCC sources.
</p>
